package com.fanshilz.flower2025.framework.aliyun.sts;

import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.auth.sts.AssumeRoleRequest;
import com.aliyuncs.auth.sts.AssumeRoleResponse;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;

public class AliyunStsUtil {

    public static AliyunSts stsToken = null;

    public static synchronized AliyunSts get() {
        if (stsToken == null || stsToken.getExpirationTime() < System.currentTimeMillis() * 600L * 1000) {
            // STS服务接入点，例如sts.cn-hangzhou.aliyuncs.com。您可以通过公网或者VPC接入STS服务。
            String endpoint = "sts.cn-shenzhen.aliyuncs.com";
            // 从环境变量中获取步骤1生成的RAM用户的访问密钥（AccessKey ID和AccessKey Secret）。
            String accessKeyId = "LTAI5tHmSqoKrfmuexi5Wf4C";
            String accessKeySecret = "568iXe9ZBvd3ZM9OCvEcfypl29e9np";
            // 从环境变量中获取步骤3生成的RAM角色的RamRoleArn。
            String roleArn = "acs:ram::1194226902798388:role/ramoss";
            // 自定义角色会话名称，用来区分不同的令牌，例如可填写为SessionTest。
            String roleSessionName = "sessionOss";
            // 临时访问凭证将获得角色拥有的所有权限。
            String policy = null;
            // 临时访问凭证的有效时间，单位为秒。最小值为900，最大值以当前角色设定的最大会话时间为准。当前角色最大会话时间取值范围为3600秒~43200秒，默认值为3600秒。
            // 在上传大文件或者其他较耗时的使用场景中，建议合理设置临时访问凭证的有效时间，确保在完成目标任务前无需反复调用STS服务以获取临时访问凭证。
            Long durationSeconds = 3600L;
            try {
                // 发起STS请求所在的地域。建议保留默认值，默认值为空字符串（""）。
                String regionId = "";
                // 添加endpoint。适用于Java SDK 3.12.0及以上版本。
                DefaultProfile.addEndpoint(regionId, "Sts", endpoint);
                // 添加endpoint。适用于Java SDK 3.12.0以下版本。
                // DefaultProfile.addEndpoint("",regionId, "Sts", endpoint);
                // 构造default profile。
                IClientProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret);
                // 构造client。
                DefaultAcsClient client = new DefaultAcsClient(profile);
                final AssumeRoleRequest request = new AssumeRoleRequest();
                // 适用于Java SDK 3.12.0及以上版本。
                request.setSysMethod(MethodType.POST);
                // 适用于Java SDK 3.12.0以下版本。
                // request.setMethod(MethodType.POST);
                request.setRoleArn(roleArn);
                request.setRoleSessionName(roleSessionName);
                request.setPolicy(policy);
                request.setDurationSeconds(durationSeconds);
                final AssumeRoleResponse response = client.getAcsResponse(request);
                AssumeRoleResponse.Credentials credentials = response.getCredentials();

                System.out.println("Expiration: " + credentials.getExpiration());
                System.out.println("Access Key Id: " + credentials.getAccessKeyId());
                System.out.println("Access Key Secret: " + credentials.getAccessKeySecret());
                System.out.println("Security Token: " + credentials.getSecurityToken());
                System.out.println("RequestId: " + response.getRequestId());

                stsToken = new AliyunSts();
                stsToken.setAccessKeyId(credentials.getAccessKeyId());
                stsToken.setSecurityToken(credentials.getSecurityToken());
                stsToken.setExpiration(credentials.getExpiration());
                stsToken.setAccessKeySecret(credentials.getAccessKeySecret());
                stsToken.setExpirationTime(System.currentTimeMillis() + 3600L * 1000);

            } catch (ClientException e) {

                System.out.println("Failed：");
                System.out.println("Error code: " + e.getErrCode());
                System.out.println("Error message: " + e.getErrMsg());
                System.out.println("RequestId: " + e.getRequestId());

            }
        }

        return stsToken;
    }

//    public static void main(String[] args) {
//        get();
//    }

}
